<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>JavaScript深入之从原型到原型链</title>
  </head>
  <body></body>
  <script>
    // 在这个例子中，Person 就是一个构造函数，我们使用 new 创建了一个实例对象 person。
    function Person() {}
    var person = new Person();
    person.name = "Kevin";
    console.log(person.name); // Kevin
    

    // prototype
    function Person1() {}
    // 虽然写在注释里，但是你要注意：
    // prototype是函数才会有的属性
    Person1.prototype.name = "Kevin";
    var person1 = new Person1();
    var person2 = new Person1();
    console.log(person1.name); // Kevin
    console.log(person2.name); // Kevin
    // 其实，函数的 prototype 属性指向了一个对象，这个对象正是调用该构造函数而创建的实例的原型，也就是这个例子中的 person1 和 person2 的原型。
    // 那什么是原型呢？你可以这样理解：每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象，这个对象就是我们所说的原型，每一个对象都会从原型"继承"属性。

    //__proto__这是每一个JavaScript对象(除了 null )都具有的一个属性，叫__proto__，这个属性会指向该对象的原型。
    console.log(person1.__proto__ === Person1.prototype);
    console.log(Object.prototype === Person1.prototype.__proto__);
    const obj = new Object()
    console.log(obj.__proto__ === Object.prototype)
    console.log(Person1.__proto__ === Function.prototype)
    console.log(person1.constructor.__proto__ === Function.prototype);
    
  </script>
</html>
